import java.util.ArrayList;
import java.util.List;

// 访问者
interface Action {
    // 访问男人
    public abstract void visit(Man man);

    // 访问女人
    public abstract void visit(Woman woman);
}

class Success implements Action {
    @Override
    public void visit(Man man) {
        System.out.println("男人" + man.getName() + "成功时，背后多半有一个伟大的女人");
    }

    @Override
    public void visit(Woman woman) {
        System.out.println("女人" + woman.getName() + "成功时，背后大多有一个不成功的男人");
    }
}

class Failure implements Action {
    @Override
    public void visit(Man man) {
        System.out.println("男人" + man.getName() + "失败时，闷头喝酒，谁也不用劝！");
    }

    @Override
    public void visit(Woman woman) {
        System.out.println("女人" + woman.getName() + "失败时，眼泪汪汪，谁也劝不了！");
    }
}

class Loving implements Action {
    @Override
    public void visit(Man man) {
        System.out.println("男人" + man.getName() + "恋爱时，努力表现得像个男人！");
    }

    @Override
    public void visit(Woman woman) {
        System.out.println("女人" + woman.getName() + "恋爱时，智商为零！");
    }
}


abstract class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // 被访问者接收访问者的访问
    public abstract void accept(Action visitor);
}

class Man extends Person {
    // 男人接收访问者访问他自己
    @Override
    public void accept(Action visitor) {
        visitor.visit(this);
    }
}

class Woman extends Person {
    // 女人接收访问者访问他自己
    @Override
    public void accept(Action visitor) {
        visitor.visit(this);
    }
}

// 对象结构
class ObjectConstructure {
    private static List<Person> persons = new ArrayList<>();

    public static void add(Person person) {
        persons.add(person);
    }

    // 删除对象--自己扩展

    // 依次访问每一个对象
    public static void display(Action visitor) {
        for (Person p :
                persons) {
            p.accept(visitor);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Man man1 = new Man();
        man1.setName("张三");
        Woman woman1 = new Woman();
        woman1.setName("李四");
        // 形成被访问者的对象结构
        ObjectConstructure.add(man1);
        ObjectConstructure.add(woman1);
        // 成功访问者
        Action visitor = new Success();
        // 让成功访问者去访问男人和女人
        ObjectConstructure.display(visitor);
        // 让失败访问者去访问男人和女人
        visitor = new Failure();
        ObjectConstructure.display(visitor);
        // 让恋爱访问者去访问男人和女人
        visitor = new Loving();
        ObjectConstructure.display(visitor);
    }
}